package com.tedu.udm.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tedu.udm.ex.ServiceException;
import com.tedu.udm.mapper.RoleMapper;
import com.tedu.udm.mapper.RolePermissionMapper;
import com.tedu.udm.mapper.UserRoleMapper;
import com.tedu.udm.pojo.dto.RoleAddNewDTO;
import com.tedu.udm.pojo.entity.Role;
import com.tedu.udm.pojo.entity.UserRole;
import com.tedu.udm.pojo.vo.RoleListItemVO;
import com.tedu.udm.service.IRoleService;
import com.tedu.udm.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 处理角色数据的业务实现类
 *
 * @author java@tedu.cn
 * @version 0.0.1
 */
@Slf4j
@Service
public class RoleServiceImpl implements IRoleService {

    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private UserRoleMapper userRoleMapper;
    @Autowired
    private RolePermissionMapper rolePermissionMapper;

    public RoleServiceImpl() {
        log.debug("创建业务对象：RoleServiceImpl");
    }
    @Override
    public void addNew(RoleAddNewDTO roleAddNewDTO) {
        log.debug("开始处理【添加角色】的业务，参数：{}", roleAddNewDTO);

        log.debug("即将检查角色名是否被占用……");
        {
            // 从参数对象中获取username
            String roleName = roleAddNewDTO.getRoleName();
            // 调用RoleMapper的countByUsername()方法执行统计查询
            QueryWrapper<Role> wrapper = new QueryWrapper<>();
            wrapper.eq("role_name",roleName);
            int count = roleMapper.selectCount(wrapper);
            // 判断统计结果是否不等于0
            if (count != 0) {
                // 是：抛出异常
                String message = "添加角色失败，角色名【" + roleName + "】已经被占用！";
                log.debug(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
        }

        // 创建Role对象
        Role role = new Role();
        // 通过BeanUtils.copyProperties()方法将参数对象的各属性值复制到User对象中
        BeanUtils.copyProperties(roleAddNewDTO, role);
        // 调用RoleMapper的insert()方法插入数据
        log.debug("即将插入角色数据，参数：{}", role);
        int rows = roleMapper.insert(role);
        // 判断插入数据的结果是否符合预期
        if (rows != 1) {
            String message = "添加角色失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    @Override
    public void delete(Long id) {
        log.debug("开始处理【删除角色】的业务，参数：{}", id);

        // 调用adminMapper的AdminStandardVO getStandardById(Long id)方法执行查询
        {
            Role queryResult = roleMapper.selectById(id);
            // 判断查询结果是否为null
            if (queryResult == null) {
                // 是：抛出异常（ERR_NOT_FOUND）
                String message = "删除角色失败，尝试删除的角色数据不存在！";
                log.debug(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }
        {
            QueryWrapper wrapper = new QueryWrapper();
            wrapper.eq("role_id",id);
            UserRole queryResult = userRoleMapper.selectOne(wrapper);
            if (queryResult == null) {
                // 是：抛出异常（ERR_NOT_FOUND）
                String message = "删除角色失败，存在与本角色关联的用户数据，请先修改相关用户角色！";
                log.debug(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }

        // 调用adminMapper的int deleteById(Long id)执行删除，并获取返回的行数
        int rows = roleMapper.deleteById(id);
        // 判断返回的行数是否不为1
        if (rows != 1) {
            // 是：抛出异常（ERR_DELETE：服务器忙）
            String message = "删除角色失败，服务器忙，请稍后再尝试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
        QueryWrapper wrapper = new QueryWrapper();
        wrapper.eq("role_id",id);
        rows = rolePermissionMapper.delete(wrapper);
        if (rows < 1) {
            // 是：抛出异常（ERR_DELETE：服务器忙）
            String message = "删除角色失败，服务器忙，请稍后再尝试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
    }

    @Override
    public List<RoleListItemVO> list() {
        log.debug("开始处理【查询角色列表】的业务，无参数");
        List<Role> roles = roleMapper.selectList(null);
        List<RoleListItemVO> list = new ArrayList<>();
        for (Role role: roles) {
            if (!"系统管理员".equals(role.getRoleName())){
                RoleListItemVO roleListItemVO = new RoleListItemVO();
                BeanUtils.copyProperties(role,roleListItemVO);
                list.add(roleListItemVO);
            }
        }
        return list;
    }
}
